package c3g;

import com.sun.javadoc.RootDoc;
import org.apache.commons.lang.StringUtils;
import java.io.File;
import java.io.IOException;
import java.util.Properties;

public class TextDemo {

    public static void main(String[] args) throws IOException, InterruptedException {
        int num=0;
        //参数1为生成或返回，参数2为生成对象的文件类型，
        for(int i=0;i<args.length;i++) {
            System.out.println(args[i]);
        }
        String filepro = "config/path.properties";
        String filepro1 = "config/agreement.properties";
        Properties props = new Properties();
        //读取配置文件
        Config config = new Config();
        config.readconfig(props, filepro);
        File file = new File(config.getInput());                          //创建文件对象
        //判断是否有ouput文件夹，若没有则生成一个
        String filepath[] =config.getOutput().split("/");
        File outputfile =new File(filepath[0]);
        if(!outputfile.exists()){
            outputfile.mkdir();
        }
        //判断是否有des文件夹，若没有则生成一个
        File desfile =new File(config.getSet_out());
        if(!desfile.exists()){
            desfile.mkdir();
        }
        desfile.createNewFile();
        //判断是否有Write文件夹，若没有则生成一个
        File Writefile =new File(config.getOutput());
        if(!Writefile.exists()){
            Writefile.mkdir();
        }
        Writefile.createNewFile();
        //遍历文件

        if(!args[0].equals("sql")&&!args[0].equals("make")&&!args[0].equals("back")&&!args[0].equals("proto")){
            System.out.println("Error: 缺少指令 make、back、proto" +
                               "make: 生成java、cs、json类文件" +
                               "back: 返回java文件中的协议号" +
                               "proto: 生成proto类文件"+
                               "sql: 生成sql格式java文件");
        }
        if (file.exists()) {                                  //遍历文件目录
            File[] files = file.listFiles();
            if (null == files || files.length == 0) {        //文件为空
                System.out.println("文件夹是空的!");
            }
            for (File file2 : files) {
                Port port = new Port();
                port.getport(filepro1, file2);
                if (port.getMajor() == null) {                           //没有协议跳出
                    continue;
                }
                Descriptorfile descriptorfile = new Descriptorfile();
                Filed filed = new Filed();
                //生成descriptorfile文件
                descriptorfile.buildDescriptorfile(file2, port, config);
                //读取descriptorfile文件
                descriptorfile.readDescriptorfile(config, port);
                //清空文件夹
                if(args[0].equals("make")) {
                    if(!args[1].equals("java")&&!args[1].equals("cs")&&!args[1].equals("json")){
                        System.out.println("Error: 缺少指令 java、cs、json" +
                                           "java: 生成java类文件" +
                                           "cs :生成cs类文件" +
                                           "json: 生成json类文件");
                    }
                    if( num==0) {
                        filed.deleteFile(config.getOutput());
                        num++;
                    }
                    if(args[1].equals("java")) {
                        //传入参数，利用模板生成java
                        descriptorfile.setOutputfile(config.getOutput()+"/make_"+port.getFilename()+".java");
                        filed.makeFile(config.getjavaVm(), descriptorfile.getOutputfile(), descriptorfile, port,args[1]);
                        System.out.println("生成java文件成功");
                    }
                    else if(args[1].equals("cs")){
                        //传入参数，利用模板生成cs
                        descriptorfile.setOutputfile(config.getOutput()+"/make_"+port.getFilename()+".cs");
                        filed.makeFile(config.getcsVm(), descriptorfile.getOutputfile(), descriptorfile, port,args[1]);
                        System.out.println("生成cs文件成功");
                    }
                    else if(args[1].equals("json")){

                        //传入参数，利用模板生成json
                        descriptorfile.setOutputfile(config.getOutput()+"/make_"+port.getFilename()+".json");
                        filed.makeFile(config.getjsonVm(), descriptorfile.getOutputfile(), descriptorfile, port,args[1]);
                        System.out.println("生成json文件成功");
                    }
                }
            }
        }
        if(args[0].equals("back")) {
            if(!args[1].equals("java")){
                System.out.println("Error: 缺少指令 java" +
                                   "java :返回java类文件的协议号");
            }
            if(args[1].equals("java")) {
                //将java文件的文件名与Major Manor输出到pro2.properties文件
                //第三个参数为读取的地址 例output/Write
                config.writeconfig("outagreement.properties", StringUtils.strip(config.getwrite(config.getInput_back()).toString().replace(", ", ""), "[]"));
                System.out.println("返回协议号成功");
            }
        }
        if(args[0].equals("proto")) {

            if (!args[1].equals("java") && !args[1].equals("enum")) {
                System.out.println("Error: 缺少指令 java" +
                        "java : 将普通java文件转化为proto文件" +
                        "enum : 将枚举类java文件转化为proto文件");
            }
            Filed ff =new Filed();
            if( num==0) {
                ff.deleteFile(config.getOut()+"/");
                num++;
            }
            if (args[1].equals("enum")) {
                File filee = new File(config.getReadenum());
                if (filee.exists()) {
                    File[] files = filee.listFiles();
                    if (null == files || files.length == 0) {        //文件为空
                        System.out.println("文件夹是空的!");
                    }
                    for (File file2 : files) {
                        Rex rex = new Rex();
                        com.sun.tools.javadoc.Main.execute(new String[]{"-doclet", Doclet.class.getName(), config.getReadenum()+"/" + file2.getName()});
                        Reflex reflex = new Reflex();
                        //反射
                        //反射Enum
                        Enum enums = new Enum();
                        enums.ShowEunm(rootDoc, rex);
                        //生成文件
                        enums.build(rex,config.getEnumvm(),config.getOut());
                    }
                    System.out.println("生成成功");
                }
            }
            //反射普通java类
            if (args[1].equals("java")) {
                File filee = new File(config.getReadjava());
                if (filee.exists()) {
                    File[] files = filee.listFiles();
                    if (null == files || files.length == 0) {        //文件为空
                        System.out.println("文件夹是空的!");
                    }
                    for (File file2 : files) {
                        Rex rex = new Rex();
                        com.sun.tools.javadoc.Main.execute(new String[]{"-doclet", Doclet.class.getName(), config.getReadjava()+"/" + file2.getName()});
                        Reflex reflex = new Reflex();
                        //反射
                        reflex.show(rootDoc, rex);
                        //生成输出proto文件
                        reflex.build(rex,config.getProtovm(),config.getOut());
                        System.out.println("生成成功");
                    }
                }
            }
        }
        if(args[0].equals("sql")){
            if (args[1].equals("java")) {
                File sqlfile = new File(config.getInput_sql());        //获取其file对象
                if (!sqlfile.exists()) {
                    System.out.println("文件夹不存在");
                }
                File[] fs = sqlfile.listFiles();    //遍历path下的文件和目录，放在File数组中
                if (null == fs || fs.length == 0) {
                    System.out.println("文件是空的");
                }
                for (File f : fs) {                    //遍历File[]数组
                    Item item = new Item();
                    SqlConfig sqlconfig = new SqlConfig();
                    sqlconfig.ReadConfig(item, f);
                    sqlconfig.build(item, config.getOutput_sql(), config.getSqlvm());
                    System.out.println("生成成功");
                }
            }
        }
    }
    private static RootDoc rootDoc;
    public static  class Doclet {
        public static boolean start(RootDoc rootDoc) {
            TextDemo.rootDoc = rootDoc;
            return true;
        }
    }
}
